并行使用多个 JPEG_Encoder_Gray 算子

简短说明

文件:
\examples\Processing\Compression\JPEG\mE5-MA-VCL\Operator_JPEG_Encoder_Gray\Multi\JPEG_Gray_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCL\Operator_JPEG_Encoder_Gray\Multi\JPEG_Color_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCL\Operator_JPEG_Encoder_Gray\Multi\Software
\examples\Processing\Compression\JPEG\mE5-MA-VCX-QP\Operator_JPEG_Encoder_Gray\JPEG_Gray_CXP_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCX-QP\Operator_JPEG_Encoder_Gray\JPEG_Color_CXP_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCX-QP\Operator_JPEG_Encoder_Gray\Software

默认平台:
mE5-MA-VCL
mE5-MA-VCX-QP

简要说明

并行使用 JPEG_Encoder_Gray 算子以提升用于 JPEG 压缩的带宽。

本示例旨在展示如何克服 JPEG_Encoder_Gray 在 JPEG 压缩中的带宽限制。 为实现这一点,需并行使用多个算子。针对 marathon mE5 VCL 平台提供了两个示例。 JPEG_Gray 示例使用四个算子并行编码全配置灰度图像。 JPEG_Color 示例使用六个算子对来自拜耳相机的图像进行编码,并对色度分量进行水平和垂直方向的子采样。

JPEG Gray - VisualApplets 设计

此设计使用四个 JPEG_Encoder_Gray 算子来对带宽最高达 1200MP/s 的图像进行编码(这对于全配置的 CameraLink 相机而言已足够)。
JPEG 流基于游程编码。每个流均以一个 DC 部分开头,后跟多个 AC 分量。 因此,为了将图像分割到多个编码器,必须按时间间隔重新开始编码。 在 JPEG 格式中,这可以通过使用重新启动标记来完成。 因此,VisualApplets 设计将图像分割为八行为一组的块(最小编码单元 (MCU) 的一行)。 在每个 MCU 行的末尾插入一个重新启动标记。

基本设计结构

图 276. 基本设计结构


在图 276 中可以看到常规的小程序。对于压缩而言,有三个有趣的层次化框(JPEGBlockSorter8x8、SplitImage 和 SYNC)。 在 JPEGBlockSorter8x8(图 277)中,八行的数据被重新排列为 8x8 像素的块。这些块会连续发送。
为了保持图像易于处理,尺寸保持不变。
SplitImage(图 279)将图像保存到 DRAM 中,并重新排列各行,使得四个连续的行对应四个独立的 MCU 块行。 通过这种方式,MCU 块行的流可以被分割并发送到 4 个独立的编码器。
SYNC 收集编码后的流,用重新启动标记替换末尾的信息标签,并将所有行追加到一个图像中。

JPEGBlockSorter8x8 框的内容

图 277. JPEGBlockSorter8x8 框的内容


首先,将八个像素追加到一个“块像素”中。在排序框中,这些“块像素”的排列方式使得每一行的块像素依次相连,如图 278 所示

JPEGBlockSorter8x8 中的像素重新排列

图 278. JPEGBlockSorter8x8 中的像素重新排列


SplitImage(图 279)框将来自 JPEGBlockSorter8x8(图 277)的行重新排列为一种方案, 在此方案中,每次会单独传输四个块。每个块由八行组成。此过程会重复进行,直到所有行都传输完毕。
在 Split 框中,图像被分割成四个图像。这是通过从不属于该图像的每个链路中移除所有行来完成的。 这些子图像被分割为 高度为八的图像,以便小程序能够在八行的末尾插入重新启动间隔。

SplitImage 框的内容

图 279. SplitImage 框的内容


SYNC 框将各个 JPEG_Converter 的流合并为一个图像。这通过三个步骤完成。首先,标记最终的字节(0xFFD9 - 图像结束标记 + 来自算子的信息)以便移除。 这在 RemoveFillByte 框(图 280)中完成。 其次,在块之间添加重新启动标记。JPEG 流中的重新启动标记结构为:“0xFFDx”, 其中 x 是从 0 到 7 循环计数的值。这在 RestartMarker 框(图 277)中完成。 第三,移除未使用的字节。

RemoveFillByte 框的内容

图 280. RemoveFillByte 框的内容


RestartMarker 框的内容

图 281. RestartMarker 框的内容


对于从此小程序中输出的图像数据,您需要将重新启动信息添加到标头中。这可以通过将 DRI 标记 (0xFF DD) 添加到标头中来完成。

JPEG Color - VisualApplets 设计

基本设计结构

图 282. 基本设计结构


此示例与灰度示例基本相同。不同之处在于:
1. 来自 Bayer 转换的 RGB 数据被转换为 YCrCb 色彩空间。
2. 对 Cr 和 Cb 分量进行子采样。
3. 分离的图像被缓存在单独的缓冲区中。为了将行排列到六个转换器而无需插入虚拟行,需要一个独立的排序缓冲区。
4. 需要将 Sync 拆分为三个高度不同的不同图像。

为了在子采样图像中使用重启间隔,需要将采样因子调整为通道中的最小 MCU 数量。我们使用 4:2:0 子采样。 这意味着 Cr 和 Cb 图像中的行宽只有一半。这就是为什么 Y 图像中的行也需要对半拆分,以便将所有重启标记放在同一位置的原因。